www.gusucode.com > 组态王 VC++ 组态软件源码源码程序 > 组态王 VC++ 组态软件源码/组态王6.5/组态王6.5/zutai2/DrawTool.cpp
// DrawTool.cpp: implementation of the CDrawTool class. //Download by http://www.codesc.net ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "DrawCli.h" #include "DrawTool.h" #include "drawdoc.h" #include "drawvw.h" #include "drawobj.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CDrawTool implementation CPtrList CDrawTool::c_tools; static CSelectTool selectTool; static CRectTool lineTool(line); static CRectTool rectTool(rect); static CRectTool roundRectTool(roundRect); static CRectTool ellipseTool(ellipse); static CRectTool circleTool(circle); //static CPolyTool polyTool; CPoint CDrawTool::c_down; UINT CDrawTool::c_nDownFlags; CPoint CDrawTool::c_last; DrawShape CDrawTool::c_drawShape = selection; CDrawTool::CDrawTool(DrawShape drawShape) { m_drawShape = drawShape; c_tools.AddTail(this); } CDrawTool* CDrawTool::FindTool(DrawShape drawShape) { POSITION pos = c_tools.GetHeadPosition(); while (pos != NULL) { CDrawTool* pTool = (CDrawTool*)c_tools.GetNext(pos); if (pTool->m_drawShape == drawShape) return pTool; } return NULL; } void CDrawTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point) { // deactivate any in-place active item on this view! COleClientItem* pActiveItem = pView->GetDocument()->GetInPlaceActiveItem(pView); if (pActiveItem != NULL) { pActiveItem->Close(); ASSERT(pView->GetDocument()->GetInPlaceActiveItem(pView) == NULL); } pView->SetCapture(); c_nDownFlags = nFlags; c_down = point; c_last = point; } void CDrawTool::OnLButtonDblClk(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& /*point*/) { } void CDrawTool::OnLButtonUp(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& point) { ReleaseCapture(); if (point == c_down) c_drawShape = selection; } void CDrawTool::OnMouseMove(CDrawView* /*pView*/, UINT /*nFlags*/, const CPoint& point) { c_last = point; SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); } void CDrawTool::OnEditProperties(CDrawView* /*pView*/) { } void CDrawTool::OnCancel() { c_drawShape = selection; } //////////////////////////////////////////////////////////////////////////// // CResizeTool enum SelectMode { none, netSelect, move, size }; SelectMode selectMode = none; int nDragHandle; CPoint lastPoint; CSelectTool::CSelectTool() : CDrawTool(selection) { } void CSelectTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point) { CPoint local = point; pView->ClientToDoc(local); CDrawObj* pObj; selectMode = none; // Check for resizing (only allowed on single selections) if (pView->m_selection.GetCount() == 1) { pObj = pView->m_selection.GetHead(); nDragHandle = pObj->HitTest(local, pView, TRUE); if (nDragHandle != 0) selectMode = size; } // See if the click was on an object, select and start move if so if (selectMode == none) { pObj = pView->GetDocument()->ObjectAt(local); if (pObj != NULL) { selectMode = move; if (!pView->IsSelected(pObj)) pView->Select(pObj, (nFlags & MK_SHIFT) != 0); // Ctrl+Click clones the selection... #ifndef _MAC if ((nFlags & MK_CONTROL) != 0) #else if ((nFlags & MK_OPTION) != 0) #endif pView->CloneSelection(); } } // Click on background, start a net-selection if (selectMode == none) { if ((nFlags & MK_SHIFT) == 0) pView->Select(NULL); selectMode = netSelect; CClientDC dc(pView); CRect rect(point.x, point.y, point.x, point.y); rect.NormalizeRect(); dc.DrawFocusRect(rect); } lastPoint = local; CDrawTool::OnLButtonDown(pView, nFlags, point); } void CSelectTool::OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point) { if ((nFlags & MK_SHIFT) != 0) { // Shift+DblClk deselects object... CPoint local = point; pView->ClientToDoc(local); CDrawObj* pObj = pView->GetDocument()->ObjectAt(local); if (pObj != NULL) pView->Deselect(pObj); } else { // "Normal" DblClk opens properties, or OLE server... if (pView->m_selection.GetCount() == 1) pView->m_selection.GetHead()->OnOpen(pView); } CDrawTool::OnLButtonDblClk(pView, nFlags, point); } void CSelectTool::OnEditProperties(CDrawView* pView) { if (pView->m_selection.GetCount() == 1) pView->m_selection.GetHead()->OnEditProperties(); } void CSelectTool::OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point) { if (pView->GetCapture() == pView) { if (selectMode == netSelect) { CClientDC dc(pView); CRect rect(c_down.x, c_down.y, c_last.x, c_last.y); rect.NormalizeRect(); dc.DrawFocusRect(rect); pView->SelectWithinRect(rect, TRUE); } else if (selectMode != none) { pView->GetDocument()->UpdateAllViews(pView); } } CDrawTool::OnLButtonUp(pView, nFlags, point); } void CSelectTool::OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point) { if (pView->GetCapture() != pView) { if (c_drawShape == selection && pView->m_selection.GetCount() == 1) { CDrawObj* pObj = pView->m_selection.GetHead(); CPoint local = point; pView->ClientToDoc(local); int nHandle = pObj->HitTest(local, pView, TRUE); if (nHandle != 0) { SetCursor(pObj->GetHandleCursor(nHandle)); return; // bypass CDrawTool } } if (c_drawShape == selection) CDrawTool::OnMouseMove(pView, nFlags, point); return; } if (selectMode == netSelect) { CClientDC dc(pView); CRect rect(c_down.x, c_down.y, c_last.x, c_last.y); rect.NormalizeRect(); dc.DrawFocusRect(rect); rect.SetRect(c_down.x, c_down.y, point.x, point.y); rect.NormalizeRect(); dc.DrawFocusRect(rect); CDrawTool::OnMouseMove(pView, nFlags, point); return; } CPoint local = point; pView->ClientToDoc(local); CPoint delta = (CPoint)(local - lastPoint); POSITION pos = pView->m_selection.GetHeadPosition(); while (pos != NULL) { CDrawObj* pObj = pView->m_selection.GetNext(pos); CRect position = pObj->m_position; if (selectMode == move) { position += delta; pObj->MoveTo(position, pView); } else if (nDragHandle != 0) { pObj->MoveHandleTo(nDragHandle, local, pView); } } lastPoint = local; if (selectMode == size && c_drawShape == selection) { c_last = point; SetCursor(pView->m_selection.GetHead()->GetHandleCursor(nDragHandle)); return; // bypass CDrawTool } c_last = point; if (c_drawShape == selection) CDrawTool::OnMouseMove(pView, nFlags, point); } //////////////////////////////////////////////////////////////////////////// // CRectTool (does rectangles, round-rectangles, and ellipses) CRectTool::CRectTool(DrawShape drawShape) : CDrawTool(drawShape) { } void CRectTool::OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point) { CDrawTool::OnLButtonDown(pView, nFlags, point); CPoint local = point; pView->ClientToDoc(local); CDrawRect* pObj = new CDrawRect(CRect(local, CSize(0, 0))); switch (m_drawShape) { default: ASSERT(FALSE); // unsuported shape! case rect: pObj->m_nShape = CDrawRect::rectangle; break; case roundRect: pObj->m_nShape = CDrawRect::roundRectangle; break; case ellipse: pObj->m_nShape = CDrawRect::ellipse; break; case line: pObj->m_nShape = CDrawRect::line; break; case circle: pObj->m_nShape = CDrawRect::circle; break; } pView->GetDocument()->Add(pObj); pView->Select(pObj); selectMode = size; nDragHandle = 1; lastPoint = local; } void CRectTool::OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point) { CDrawTool::OnLButtonDblClk(pView, nFlags, point); } void CRectTool::OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point) { if (point == c_down) { // Don't create empty objects... CDrawObj *pObj = pView->m_selection.GetTail(); pView->GetDocument()->Remove(pObj); pObj->Remove(); selectTool.OnLButtonDown(pView, nFlags, point); // try a select! } selectTool.OnLButtonUp(pView, nFlags, point); } void CRectTool::OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point) { SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS)); selectTool.OnMouseMove(pView, nFlags, point); }